//
//  NSDate+YHCommon.h
//  YHBaseProject
//
//  Created by 刘宇航 on 2018/5/1.
//  Copyright © 2018 lyh. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSUInteger, YHDateComponentsType) {
    YHDateComponentsTypeYear,
    YHDateComponentsTypeMonth,
    YHDateComponentsTypeDay,
    YHDateComponentsTypeHour,
    YHDateComponentsTypeMinute,
    YHDateComponentsTypeSecond,
    YHDateComponentsTypeWeekday
};


@interface NSDate (XMCommon)

+ (NSCalendar *)xm_calendar;

+ (NSCalendar *)xm_chineseCalendar;

+ (NSDateFormatter *)xm_dateFormatter:(NSString *)dateFormat;

///  短日期
- (NSString *)xm_shortTimeTextOfDate;

/// 短日期
- (NSString *)xm_timeTextOfDate;

/// 判断给定时间是不是今天
- (BOOL)xm_isToday;

/// 判断给定时间是不是昨天
- (BOOL)xm_isYesterday;

/// 获取当前时间点的时间戳
/// @param lenght 时间戳精确度 10 位:精确到秒   13 位:精确到毫秒
+ (NSString *)xm_getCurrentTimeIntervalWithLenght:(NSInteger)lenght;

///  将 NSDate 转成 NSDateComponents 类型
+ (NSDateComponents *)xm_dateComponentsWithDate:(NSDate *)date;

/// 获取当前时间
+ (NSString *)xm_stringCurrentDateWithDateFormat:(NSString *)dateFormat;

/// NSDate 转 NSString
+ (NSString *)xm_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat;

///  NSString 转 NSDate
+ (NSDate *)dateFromDateString:(NSString *)dateString dateFormat:(NSString *)dateFormat;


/// 时间格式转换
/// @param dateStr 时间
/// @param oldDateFormat dateStr 目前的格式
/// @param newDateFormat dateStr 转换的新格式
+ (NSString *)stringTransDateFormatWithDateStr:(NSString *)dateStr oldDateFormat:(NSString *)oldDateFormat newDateFormat:(NSString *)newDateFormat;

/// 获取农历时间
+ (NSDateComponents *)xm_lunarCalendarWithDate:(NSDate *)date;

/// 时间比较
/// @param dateA dateA
/// @param dateB dateB
/// @param dateFormatter  -1：dateA>dateB   0：相等  1：dateA<dateB
+ (NSInteger)compareDateA:(NSString *)dateA dateB:(NSString *)dateB dateFormatter:(NSString *)dateFormatter;

/**
 两个时间比较
 @param dateA 第一个时间
 @param dateB 第二个时间
 @param dateFormatter 时间格式
 @return NSComparisonResult
 NSOrderedAscending = -1L, dateA > dateB  升序
 NSOrderedSame,  dateA == dateB
 NSOrderedDescending dateA < dateB  降序
 */
+ (NSComparisonResult)xm_compareDateWithDateA:(NSString *)dateA dateB:(NSString *)dateB dateFormatter:(NSString *)dateFormatter;

/**
 获取给定日期的月份
 @param date 给定日期
 */
+ (NSInteger)xm_monthFromDate:(NSDate *)date;

/**
 获取给定日期所在周 是在当月的第几周
 @param date 给定日期
 */
+ (NSInteger)xm_weekInMonthIndexWithDate:(NSDate *)date;

/**
 获取给定日期所在月中有多少周
 @param date 给定日期
 */
+ (NSInteger)xm_numberWeeksInMonthWithDate:(NSDate *)date;

/**
 a period of time from the current time
 以当前时间为起点,间隔几个时间单位的 date
 @param type 时间类型,间隔的是几年/月/日/时/分/秒/星期
 @param length 长度可以是正负数，
 正数是以当前时间为起点，向未来的时间间隔出几个时间单位。
 负数是以当前时间为起点，向过去时间间隔出几个时间单位。
 @return return value description
 */
+ (NSDate *)xm_datePeriodOfDateFromCurrentDateWithComponentsType:(YHDateComponentsType)type periodLength:(NSInteger)length;

/**
 a period of time from the current time
 以当前时间为起点,间隔几个时间单位的 date
 @param startDate  以 startDate 为起始时间
 @param type 时间类型,间隔的是几年/月/日/时/分/秒/星期
 @param length 长度可以是正负数，
 正数是以当前时间为起点，向未来的时间间隔出几个时间单位。
 负数是以当前时间为起点，向过去时间间隔出几个时间单位。
 @return return value description
 */
+ (NSDate *)xm_datePeriodOfDateFromStertDate:(NSDate *)startDate
                              componentsType:(YHDateComponentsType)type
                                periodLength:(NSInteger)length;

/// 判断给定日期 是周几 // 1 是周日，2是周一 3.以此类推
+ (NSInteger)weekDayStringWithDate:(NSDate *)date;

/// 转换 时间展示样式
/// @param date 日期
- (NSString *)getDateDisplayString:(NSDate *)date;

/// 判断 给定日期 是不是工作日
+ (BOOL)isWorkingDayWith:(NSDate *)date;

/// 比较日期是否相等
+ (BOOL)isEqual:(NSDate *)dateA other:(NSDate *)dateB dateFormatter:(NSString *)dateFormat;

///  给定日期时间 判断是不是今天的当前时间
+ (BOOL)isCurrentDate:(NSDate *)date dateFormatter:(NSString *)dateFormat;

@end
